var _ = require('underscore'); var print = console.log;  // 向 Python 致敬..., 主要是因为 console.log() 太长
// JS 自带的 map, reduce, filter 只支持 Array
// underscore 为集合类对象提供了一致的接口, 集合类是指 Array 和 Object, 暂不支持 Map 和 Set
// map(), mapObject()
var obj = { name: 'bob', school: 'No.1 middle school', address: 'xueyuan road' };
print(_.map([1, 2, 3], (x) => x * x));  // [1, 4, 9]
print(_.map({ a: 1, b: 2, c: 3 }, (v, k) => k + '=' + v));  // ['a=1', 'b=2', 'c=3'], 这里的 map 可以作用于 Object... 好厉害, 更像 Python 了
print(_.map(obj, (v, k) => k + '=' + v));  // 1. (v, k) 顺序好奇葩 2. 对 Object 作 map() 操作的返回结果是 Array
print(_.mapObject(obj, (v, k) => v));  // 这样返回的就是 Object
// every() 所有元素满足是返回 true, some() 至少一个元素满足时返回 true
print(_.every([1, 4, 7, -3, -9], (x) => x > 0));  // false, 所有元素 >0
print(_.some([1, 4, 7, -3, -9], (x) => x > 0));  // true, 至少一个元素 >0
// max(), min() 返回集合中最大最小的数
print(_.max([1, 3, 4]), _.min([1, 3, 4]));  // 4 1
print(_.max({ a: 1, b: 2, c: 3 }));  // 3, 集合是 Object, 作用于 value, 忽略掉 key
// groupBy() 把集合的元素按照 key 归类, key 由传入的函数返回
var scores = [20, 81, 75, 40, 91, 59, 77, 66, 72, 88, 99];
print(_.groupBy(scores, function (x) { if (x < 60) { return 'C'; } else if (x < 80) { return 'B'; } else { return 'A'; } }));
    // { C: [ 20, 40, 59 ], A: [ 81, 91, 88, 99 ], B: [ 75, 77, 66, 72 ] }
// shuffle() 用洗牌算法随机打乱一个集合
print(_.shuffle([1, 2, 3, 4, 5, 6]));  // [3, 5, 4, 6, 2, 1], 注意每次结果都不一样
// sample() 则是随机选择一个或多个元素
print(_.sample([1, 2, 3, 4, 5, 6]));  // 2, 随机选 1 个
print(_.sample([1, 2, 3, 4, 5, 6], 3));  // [6, 1, 4], 随机选 3 个


